#include "stm32f10x.h"                  // Device header
#include <time.h>


void SysRTC_SetTime(uint16_t year, uint8_t mon, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec) {
	struct tm time_date;	//定义日期时间数据类型
	time_date.tm_year = year - 1900;		//将数组的时间赋值给日期时间结构体
	time_date.tm_mon = mon - 1;
	time_date.tm_mday = day;
	time_date.tm_hour = hour;
	time_date.tm_min = min;
	time_date.tm_sec = sec;
	
	time_t time_cnt = mktime(&time_date);
	
	RTC_SetCounter(time_cnt - 8 * 60 * 60);						//将秒计数器写入到RTC的CNT中
	RTC_WaitForLastTask();							//等待上一次操作完成
}

void SysRTC_Init(void) {
	/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);		//开启PWR的时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);		//开启BKP的时钟
	
	/*备份寄存器访问使能*/
	PWR_BackupAccessCmd(ENABLE);							//使用PWR开启对备份寄存器的访问
	
	if (BKP_ReadBackupRegister(BKP_DR1) != 0xCAFE)			//通过写入备份寄存器的标志位，判断RTC是否是第一次配置
															//if成立则执行第一次的RTC配置
	{
		RCC_LSEConfig(RCC_LSE_ON);							//开启LSE时钟
		while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) != SET);	//等待LSE准备就绪
		
		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);				//选择RTCCLK来源为LSE
		RCC_RTCCLKCmd(ENABLE);								//RTCCLK使能
		
		RTC_WaitForSynchro();								//等待同步
		RTC_WaitForLastTask();								//等待上一次操作完成
		
		RTC_SetPrescaler(32768 - 1);						//设置RTC预分频器，预分频后的计数频率为1Hz
		RTC_WaitForLastTask();								//等待上一次操作完成
		
		SysRTC_SetTime(2024, 4, 13, 1, 53, 0);									//设置时间，调用此函数，全局数组里时间值刷新到RTC硬件电路
		
		BKP_WriteBackupRegister(BKP_DR1, 0xCAFE);			//在备份寄存器写入自己规定的标志位，用于判断RTC是不是第一次执行配置
	}
	else													//RTC不是第一次配置
	{
		RTC_WaitForSynchro();								//等待同步
		RTC_WaitForLastTask();								//等待上一次操作完成
	}
}

time_t SysRTC_GetTimestamp(void) {
	return RTC_GetCounter();
}

struct tm SysRTC_GetTime(struct tm* date) {
	time_t time_cnt = SysRTC_GetTimestamp() + 8 * 60 * 60;
	date = localtime(&time_cnt);				//使用localtime函数，将秒计数器转换为日期时间格式
	return *date;
}
